From 1d5fdd620951724967c4ec8cb7ebd62d433e9028 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 4 Jan 2007 06:09:13 +0000 Subject: [PATCH] Rework the beep-on-uninserted-text by calling the input method regardless 2007-01-03 Matthias Clasen * gtk/gtktextview.c: Rework the beep-on-uninserted-text by calling the input method regardless of editability, and beeping from the commit/preedit-changed handlers. (#390514, Yevgen Muntyan) svn path=/trunk/; revision=17054 --- ChangeLog | 7 +++++++ gtk/gtktextview.c | 32 +++++++++++++++++--------------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index 04fc4e9668..db177da2c6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2007-01-03 Matthias Clasen + + * gtk/gtktextview.c: Rework the beep-on-uninserted-text + by calling the input method regardless of editability, + and beeping from the commit/preedit-changed handlers. + (#390514, Yevgen Muntyan) + 2007-01-03 Matthias Clasen Fix #332604, reported by Joe Wreschnig, patch diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c index 839cb3d384..910125dbdc 100644 --- a/gtk/gtktextview.c +++ b/gtk/gtktextview.c @@ -3874,11 +3874,12 @@ gtk_text_view_key_press_event (GtkWidget *widget, GdkEventKey *event) insert = gtk_text_buffer_get_insert (get_buffer (text_view)); gtk_text_buffer_get_iter_at_mark (get_buffer (text_view), &iter, insert); can_insert = gtk_text_iter_can_insert (&iter, text_view->editable); - if (can_insert && - gtk_im_context_filter_keypress (text_view->im_context, event)) + if (gtk_im_context_filter_keypress (text_view->im_context, event)) { text_view->need_im_reset = TRUE; - obscure = TRUE; + if (!can_insert) + gtk_text_view_reset_im_context (text_view); + obscure = can_insert; retval = TRUE; } /* Binding set */ @@ -3930,18 +3931,6 @@ gtk_text_view_key_press_event (GtkWidget *widget, GdkEventKey *event) gtk_text_view_reset_blink_time (text_view); gtk_text_view_pend_cursor_blink (text_view); - if (!retval) - { - /* We only want to beep if we are reasonably sure - * the event was meant to insert some character into - * the buffer, but failed. We don't beep on events - * which look like attempts to activate an accelerator. - */ - if (!event->is_modifier && - ((event->state & (gtk_accelerator_get_default_mod_mask () & ~GDK_SHIFT_MASK)) == 0)) - gtk_widget_error_bell (widget); - } - return retval; } @@ -6937,6 +6926,19 @@ gtk_text_view_preedit_changed_handler (GtkIMContext *context, gchar *str; PangoAttrList *attrs; gint cursor_pos; + GtkTextIter iter; + + gtk_text_buffer_get_iter_at_mark (text_view->buffer, &iter, + gtk_text_buffer_get_insert (text_view->buffer)); + + /* Keypress events are passed to input method even if cursor position is not editable; + * so beep here if it's multi-key input sequence, input method will be reset in + * key-press-event handler. */ + if (!gtk_text_iter_can_insert (&iter, text_view->editable)) + { + gtk_widget_error_bell (GTK_WIDGET (text_view)); + return; + } gtk_im_context_get_preedit_string (context, &str, &attrs, &cursor_pos); gtk_text_layout_set_preedit_string (text_view->layout, str, attrs, cursor_pos); -- 2.30.2